TCP

✒️ 2025-05-31 23:02 내용 수정


참고 자료 : NordVPN TCP UDP 차이: 두 프로토콜 비교

TCP(Transmission Control Protocol)

참고 자료 : 위키백과 전송 제어 프로토콜, wikipedia TCP, mdn web docs TCP

두 장치 간의 데이터를 순서대로 교환하게 하는 프로토콜


TCP 세그먼트

TCP 세그먼트 생성

  1. 데이터 스트림으로부터 데이터를 받아들여 청크 단위로 분할한다.
  2. 분할된 청크에 TCP Header를 붙여 TCP 세그먼트를 만든다.
  3. TCP 세그먼트를 IP 데이터그램에 패킷화하여 상대방과 주고받는다.

세그먼트 구조

헤더 설명
출발지와 목적지 포트 번호
순서 번호
(Sequence Number)
데이터의 순서와 재조립을 위한 번호
확인 응답 번호
(Acknowledgment Number)
패킷 수신 확인에 사용되는 일련번호
데이터 오프셋 TCP 헤더 크기
플래그 TCP 연결 설정, 종료, 데이터 전송 상태 등을 나타내는 플래그 정보
창 크기(Window size) 패킷을 받을 수 있는 창의 크기
체크섬(Checksum) 오류 검출을 위한 체크섬
긴급 포인터 긴급 데이터 바이트를 가리키는 포인터
기타 옵션

TCP의 동작

참고 자료 : mdn web docs TCP 핸드셰이크, Geeksforgeeks TCP 3-Way Handshake Process, Geeksforgeeks Why TCP Connect Termination Nedd 4-Way-Handshake, wikipedia TCP Protocol operation

상태 엔드포인트 설명
LISTEN 서버 서버가 연결 요청을 기다리는 상태
SYN-SENT 클라이언트 클라이언트가 연결 요청(SYN)을 보낸 후 응답을 기다리는 상태
SYN-RECEIVED 서버 서버가 SYN을 수신하고, SYN-ACK를 보낸 후 ACK를 기다리는 상태
ESTABLISHED 서버
클라이언트
연결이 성립되어 데이터 전송이 가능한 상태
FIN-WAIT-1 서버
클라이언트
연결 종료를 위해 FIN을 보낸 후 ACK 또는 FIN을 기다리는 상태
FIN-WAIT-2 서버
클라이언트
FIN에 대한 ACK를 받은 후, 상대방의 FIN을 기다리는 상태
CLOSE-WAIT 서버
클라이언트
상대방의 FIN을 수신하고, 애플리케이션의 종료 요청을 기다리는 상태
CLOSING 서버
클라이언트
양측이 동시에 FIN을 전송하고 상대방의 ACK를 기다리는 상태
LAST-ACK 서버
클라이언트
이전 연결 종료 요청에 대한 ACK와 연결 종료 요청 FIN을 보낸 후
상대방의 ACK를 기다리는 상태
마지막으로 상대의 ACK를 기다리는 상태
TIME-WAIT 서버
클라이언트
마지막 ACK를 보낸 후, 지연된 패킷이 네트워크를 떠날 때까지 기다리는 상태.
CLOSED 서버
클라이언트
연결이 존재하지 않는 상태

1. 연결 생성

TCP 3-Way Handshake

  1. SYN(Synchronize) : 클라이언트가 서버로 SYN을 전송하면서 active open이 수행된다.

    • 클라이언트는 세그먼트 전송 시 임의의 초기 순서 번호(ex: A)를 설정한다.
  2. SYN-ACK(SYN-Acknowledgment) : 이에 대한 응답으로 서버는 SYN-ACK를 클라이언트로 전송한다.

    • Acknowledgment 숫자는 수신했던 세그먼트 초기 순서 번호에 1을 더한 값(ex: A+1)으로 설정한다.
    • 서버는 패킷의 순서 번호를 또 다른 임의의 값(ex: B)으로 설정하여 전송한다.
  3. ACK(Acknowledgment) : 클라이언트는 서버로 ACK를 보낸다.

    • 순서 번호는 서버에서 수신한 Acknowledgment 숫자(ex: A+1)로 설정한다.
    • 클라이언트는 서버에 전송할 Acknowledgment 숫자를 서버의 패킷 순서 번호에 1을 더한 값(ex: B+1)으로 설정한다.

tcp_3way_handshake.png


2. 데이터 전송

1) 순서가 보장된 전송

2) 데이터 손실 확인 및 재전송

  1. 재전송 타임아웃(RTO)

    • 송신자가 데이터를 보낸 후, ACK 도착 시간을 확인하는 타이머를 가동하여 데이터의 손실 여부를 확인한다.
    • ACK를 받지 못한 경우에만 작동하기 때문에 패킷 재정렬이나 지연으로 인한 오탐지 가능성이 있다.
  2. 중복 누적 ACK

    • 세그먼트가 손실되면 세그먼트의 번호를 확인할 수 없다.
    • 수신자는 누적 ACK 방식을 사용하기 때문에 세그먼트들의 번호를 누적으로 확인하며, 손실된 세그먼트 이후의 패킷을 확인할 수 없다.
    • 따라서 이후의 데이터 패킷을 수신하더라도 수신하지 못한 세그먼에 대한 ACK를 계속 보낸다.
    • 중복으로 누적된 확인 응답은 패킷 손실의 신호로 보고, 송신자가 수신자로부터 3번의 중복된 ACK를 확인하면 손실된 패킷을 다시 전송한다.
  3. 시간 기반 손실 감지(RACK)


3. 연결 종료

TCP 4-Way Handshake

  1. FIN(종료 요청) : 클라이언트에서 FIN 패킷을 전송한다.

    • active close로 FIN을 전송한 후 FIN_WAIT_1 상태이다.
  2. ACK(확인 응답) : 서버에선 ACK 패킷으로 확인 응답을 보낸다.

    • 서버는 클라이언트로부터 종료 요청을 수신하더라도 데이터를 독립적으로 더 전송할 수도 있다.
    • passive close로 CLOSE_WAIT 상태이다.
    • 클라이언트는 ACK를 수신 후 FIN_WAIT_2 상태가 된다.
  3. FIN(종료 요청) : 서버에서 통신이 종료되면 FIN 패킷을 전송한다.

    • 데이터 전송이 모두 완료된 후에 FIN 요청을 보낸다.
      • 따라서 2번 ACK와 상태가 다르기 때문에 ACK와 FIN을 동시에 보내는 것은 위험하다.
    • 서버는 LAST_ACK 상태이며, 클라이언트는 FIN 수신 후 TIME_WAIT 상태가 된다.
  4. ACK(확인 응답) : 클라이언트는 ACK 패킷을 전송하여 통신을 마무리한다.

    • 서버는 ACK 수신 후 CLOSED 상태가 되며, 클라이언트도 CLOSED 상태가 된다.

tcp_4way_handshake.png